package otc.regate.serveur.controleur;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.TreeMap;

import otc.regate.serveur.modele.Coordonnees;
import otc.regate.serveur.modele.Course;
import otc.regate.serveur.modele.Utilitaire;
import otc.regate.serveur.vue.Visualisation;

/**
 * Serveur de l'application. Il permet d'affecter un thread pour chaque client.
 *
 * @author Escop, Jacquet, Loiret, Marboeuf, Millet, Montferrand
 *
 */
public class Serveur {

    /** Port du connexion au serveur. */
    private int port;
    /** Classe qui represente la course. */
    private Course course;

    /**
     * Constructeur.
     *
     * @param c course
     */
    public Serveur(final Course c) {
        try {
            // Mise a jour
            HashMap<String, TreeMap<Date, Coordonnees>> listeCoordonneesDate =
                new HashMap<String, TreeMap<Date, Coordonnees>>();

            this.port = 9635;
            this.course = c;

            ServerSocket socketServeur = new ServerSocket(this.port);
            System.out.println("Lancement du serveur");

            int i = 0;
            ArrayList<Socket> listeClient = new ArrayList<Socket>();
            while (i < Utilitaire.participants.size()) {
                Socket socketRegate = socketServeur.accept();
                listeClient.add(socketRegate);
                ThreadServeur t = new ThreadServeur(socketRegate, this.course);
                t.start();
                i++;
            }

            // Place les bateaux
            int j = 0;
            while (j < course.getParticipants().size()) {
                listeCoordonneesDate.put(course.getParticipant(j).getSkipper(),
                        course.getParticipant(j).getTransmissions());
                j++;
            }

            // Une fois tous les clients connectes, on envoie un message a ces
            // derniers, afin de demarrer la course.
            i = 0;
            while (i < course.getParticipants().size()) {
                ObjectOutputStream outputStream = new ObjectOutputStream(
                        listeClient.get(i).getOutputStream());
                outputStream.writeObject("");
                i++;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * Permet de lancer la visualisation de la course.
     *
     * @param date date
     */
    public final void miseAJour(final Date date) {
        int i = 0;
        HashMap<String, TreeMap<Date, Coordonnees>> listeCoordonneesDate =
            new HashMap<String, TreeMap<Date, Coordonnees>>();
        while (i < course.getParticipants().size()) {

            listeCoordonneesDate.put(course.getParticipant(i).getSkipper(),
                    course.getParticipant(i).getTransmissions());

            i++;
        }
        Visualisation visualisation = new Visualisation(
                Utilitaire.pointsDePassage, listeCoordonneesDate, date);
        visualisation.show();
    }

}